//! 数组

use std::fmt::Debug;


// 数组的定义
fn f1() {
    // 定义一个四个元素的数组
    let a1 = [1,2,3,4];

    // 定义一个四个元素1的数组
    let a1 = [1;4];
}

/// 数组的传参[i32;4]和[i32;3]是不同的类型
fn f2(a1:[i32;4]) {
    println!("arrays:{:?}", a1);
}


/// 定义泛型数组
fn f3<T:Debug>(a1:[T;4]) {
    println!("arrays:{:?}", a1);
}

/// 定义泛型数组,长度也支持泛型，表示接受任意长度的数组大小
/// const N表示是一个const泛型 可以用于值的泛型，不能省去const，usize是个具体类型，不能作为trait限定
fn f4<T:Debug, const N:usize>(a1:[T;N]) {
    println!("arrays:{:?}", a1);
}

#[cfg(test)]
mod test {

    use super::*;
    
    #[test]
    fn test2() {
        let a1 = [1,2,3,4];
        f2(a1);

        // 下面的回报错，不支持
        // let a1 = [1,2,3];
        // f2(a1);
    }

    #[test]
    fn test3() {
        let a1 = [1,2,3,4];
        f3(a1);
    }

    #[test]
    fn test4() {
        let a1 = [1,2,3,4];
        f4(a1);

        let a1 = [1,2,3,4,5];
        f4(a1);
    }

}